シリアル通信機能の使い方
シリアル通信機能を持った周辺回路を、USART(Universal Synchronous Asynchronous Receiver Transmitter) とも言います(USART はシリアル通信インターフェイス、SCI とも呼ばれます)。この機能により、全二重非同期システムとしてパソコンと通信できるようになります。(または、半二重同期システムとしてシリアルEEPROM と通信できる構成もあります。)
USARTの制御用レジスタ
シリアル通信関連の制御用レジスタとして、TXSTA,RCSTA,SPBREGの3種類のレジスタがあります。まず、これらの内容と機能を把握する必要があります。
(A)TXSTAレジスタ(Bank1)
TXSTAレジスタの構成は図1のようになっていて、送信の動作モードを指定します。
![]() |
図1. TXSTAレジスタの構成 |
TXSTAレジスタの機能について、表1に示します。
bit | 名称 | 機能 | データ | 意味 | |
7 | CSRC | クロック選択 指定ビット |
非同期 | − | 非同期モードでは無視 |
同期 | 1 | マスターモード(内部でBRG から発生するクロック) | |||
0 | スレーブモード(外部ソースからのクロック) | ||||
6 | TX9 | 9 ビット送信 モード指定ビット |
1 | 9ビット送信を選択 | |
0 | 8ビット送信を選択 | ||||
5 | TXEN | 送信許可 指定ビット |
1 | 許可 | |
0 | 禁止 | ||||
4 | SYNC | USART モード 選択ビット |
1 | 同期モード | |
0 | 非同期モード | ||||
3 | − | なし | − | 「0」とリードされる | |
2 | BRGH | 高速ボーレート 選択ビット |
非同期 | 1 | 高速 |
0 | 低速 | ||||
同期 | − | 同期モードでは無視 | |||
1 | TRMT | 送信レジスタ ステータスビット |
1 | TSR が空 | |
0 | TSR がフル | ||||
0 | TX9D | 送信データの第9 ビット | − | パリティビットとして使用可能 |
(B)RCSTAレジスタ(Bank0)
RCSTAレジスタの構成は図2のようになっていて、受信の動作モードを指定します。
![]() |
図2. RCSTAレジスタの構成 |
RCSTAレジスタの機能について、表2に示します。
bit | 名称 | 機能 | データ | 意味 | ||
7 | SPEN | シリアルピン指定ビット | 1 | シリアルポートを許可 (RC7/RX/DT およびRC6/TX/CK ピンは シリアルポートピンとして構成) |
||
0 | シリアルポートを禁止 (RC7/RX/DT およびRC6/TX/CK ピンは 汎用ポートピンとして構成) |
|||||
6 | RX9 | 9 ビット受信 モード指定ビット |
1 | 9ビット受信を選択 | ||
0 | 8ビット受信を選択 | |||||
5 | SREN | シングル受信許可 指定ビット |
非同期 | − | 非同期モードでは無視 | |
同期 | スレーブ | − | 使用しません。 | |||
マスター | 1 | 許可 | ||||
0 | 禁止 | |||||
4 | CREN | 連続受信許可ビット | 非同期 | 1 | 連続受信は許可 | |
0 | 連続受信は禁止 | |||||
同期 | 1 | CREN がクリアされるまでは連続受信可能 (CREN はSREN をオーバーライドする) |
||||
0 | 連続受信は禁止 | |||||
3 | ADDEN | アドレス検出許可ビット | 1 | アドレス検出は許可、RSR<8>が1 のとき、 受信バッファの割り込みとロードが許可 |
||
0 | アドレス検出は禁止、全バイトを受信、 第9 ビットはパリティビットとして使用可能 |
|||||
2 | FERR | フレーミングエラー ステータスビット |
1 | フレーミングエラー(RCREG レジスタのリードにより 更新でき、次の有効バイトを受信する) |
||
0 | フレーミングエラーなし | |||||
1 | OERR | オーバーランエラー ステータスビット |
1 | オーバーランエラー (ビットCREN のクリアによりクリア可能) |
||
0 | オーバーランエラーなし | |||||
0 | RX9D | 受信データの第9 ビット | − | パリティビットとして使用可能 |
(C)SPBRGレジスタ(Bank1)
SPBRGレジスタにより、通信速度を決めます。このSPBRGレジスタの設定値とボーレートの関係を表3に示します。(MicroChip社 データシート参照)
クロック | 20MHz | 16MHz | 10MHz | ||||||
ボーレート (bps) |
SPBRG 設定値 |
エラー レート |
SPBRG 設定値 |
エラー レート |
SPBRG 設定値 |
エラー レート |
|||
10進 | 16進 | 10進 | 16進 | 10進 | 16進 | ||||
1200 | D’255’ | H’0FF’ | +1.73 | D’207’ | H’0CF’ | +0.16 | D’129’ | H’81’ | +0.16 |
2400 | D’129’ | H’81’ | +0.16 | D’103’ | H’67’ | +0.16 | D’64’ | H’40’ | +0.16 |
9600 | D’32’ | H’20’ | −1.36 | D’25’ | H’19’ | +0.16 | D’15’ | H’0F’ | +1.73 |
19.2k | D’15’ | H’0F’ | +1.73 | D’12’ | H’0C’ | +0.16 | D’7’ | H’7’ | +1.73 |
76.8k | D’3’ | H’3’ | +1.73 | D’2’ | H’2’ | +8.51 | D’1’ | H’1’ | +1.73 |
クロック | 20MHz | 16MHz | 10MHz | ||||||
ボーレート (bps) |
SPBRG 設定値 |
エラー レート |
SPBRG 設定値 |
エラー レート |
SPBRG 設定値 |
エラー レート |
|||
10進 | 16進 | 10進 | 16進 | 10進 | 16進 | ||||
9600 | D’129’ | H’81’ | +0.16 | D’103’ | H’67’ | +0.16 | D’64’ | H’40’ | +0.16 |
19.2k | D’64’ | H’40’ | +0.16 | D’51’ | H’33’ | +0.16 | D’32’ | H’20’ | −1.36 |
38.4k | D’32’ | H’20’ | −1.36 | D’25’ | H’19’ | +0.16 | D’15’ | H’0F’ | +1.7 |
57.6k | D’21’ | H’15’ | −1.36 | D’16’ | H’10’ | +2.12 | D’10’ | H’0A’ | −1.36 |
115.2k | D’10’ | H’0A’ | −1.36 | D’8’ | H’8’ | −3.55 | D’4’ | H’4’ | +8.51 |
表4に、ボーレートの計算式を示します。これはマスターモード(内部クロック)のみに適用されます。希望のボーレートとFOSC を当てはめれば、表4の式を使用してSPBRG レジスタの最も近い整数値を計算できます。この値からボーレートのエラーを判定することができます。
モード | 設定 | ボーレート計算式 ボーレート= |
||
SYNC | BRGH | |||
非同期 | 低速 | 0 | 0 | FOSC/(64(X+1)) |
高速 | 0 | 1 | FOSC/(16(X+1)) | |
同期 | − | 1 | − | FOSC/(4(X+1)) |
例として、FOSC =16MHz 希望のボーレート=9600(非同期:低速モード)の条件でのボーレートエラーの計算例を示します。
表4より、希望のボーレート=FOSC/(64(X+1))
9600=16000000/(64(X+1))
X≒25 となる。
ここで、算出ボーレート=16000000/(64×(25+1))=9615
エラー=( [算出ボーレート]−[希望ボーレート] )/ [希望ボーレート」
=(9615−9600)/9600=0.16%
というように求めます。
遅いボークロックに関しても高速ボーレート(BRGH=1)を使用したほうがよい場合があります。これは、場合によって、FOSC/(16(X
+ 1))のほうがボーレートエラーが小さい場合です。
USART 非同期モード
このモードでは、USARTは標準のノン・リターン・トゥ・ゼロ(NRZ)フォーマット(1
スタートビット、8 または9 データビット、1 ストップビット)を使用します。最もよく使用されるデータフォーマットは8
ビットです。オン・チップ専用8 ビットボーレート発生器を使用して、オシレータから標準ボーレート周波数をつくることができます。USART
はLSBから先に送信および受信します。USART のトランスミッターとレシーバーは機能的には独立していますが、同じデータフォーマットとボーレートを使用します。ボーレート発生器は、ビットBRGH(TXSTA<2>)により、シフトレートがX16
またはX64 のどちらかのクロックを生成します。パリティはハードウエアではサポートされていませんが、ソフトウエアで作成可能です(第9
データビットに格納する)。非同期モードはスリープ中は停止します。非同期モードはビットSYNC(TXSTA<4>)をクリアすることにより選択します。
USART 非同期モジュールは主に次の要素から成ります。
USART 非同期トランスミッター
USART トランスミッターのブロック図を図3に示します。
![]() |
|
図3.USART トランスミッターのブロック図(MicroChip社データシート参照) |
トランスミッターの中心部は送信(シリアル)シフトレジスタ(TSR )です。シフトレジスタはリード/ライト送信バッファ、TXREG
からデータがロードされます。TXREG レジスタにはソフトウエアでデータがロードされます。TSR
レジスタは前のロードのSTOPビットが送信されるまでロードされません。STOP
ビットが送信されると、TSR には直ちにTXREG レジスタからの新規データが(あれば)ロードされます。TXREGレジスタがTSR
レジスタにデータを転送すると(1TCYで実行)TXREG レジスタは空になり、フラグビットTXIF(PIE1<4>)がセットされます。この割り込みはイネーブルビットTXIE(PIE1<4>)をセット/クリアすることによりイネーブル/ディセーブルできます。フラグビットTXIF
はTXIE に関係なくセットされ、ソフトウエアではクリアできません。このビットはTXREG
レジスタに新しいデータがロードされたときにのみリセットします。フラグビットTXIF
はTXREG レジスタのステータスを示し、別のビットTRMT(TXSTA<1>)はTSR レジスタのステータスを示します。ステータスビットTRMT
はTSR レジスタが空のときにセットされるリード・オンリービットです。このビットは割り込みとは連動しません。TSR
レジスタが空かどうかを判定するために、このビットをポーリングできます。
<注意事項>
非同期送信のセットアップ手順(MicroChip社データシート参照)
USART 非同期レシーバー
USART レシーバーのブロック図を図4に示します。
![]() |
|
図4.USARTレシーバのブロック図(MicroChip社データシート参照) |
データは、RC7/RX/DT ピンに受信されてデータ回復ブロックをドライブします。データ回復ブロックは実際はX16倍ボーレートで動作する高速シフタです。なお、メイン受信シリアルシフタはビットレートまたはFOSC
で動作します。USART モジュールにはマルチ・プロセッサ通信用の特別な機能があります。RX9
ビットがRCSTA レジスタにセットされると、9 ビットが受信されて、第9 ビットはRCSTA
レジスタのRX9D ステータスビットに配置されます。ポートは、ストップビットを受信したときにRX9D
ビット=1 のときのみシリアルポート割り込みが発生するようにプログラムすることができます。この機能はRCSTA
レジスタにADDEN ビットRCSTA<3>をセットすることにより動作できるようになります。この機能は次のようなマルチ・プロセッサシステムで使用できます。
マスタープロセッサは1 ブロックのデータを複数のスレーブの1 つに送信しようとします。プロセッサはまず目標のスレーブを識別するアドレスバイトを送信しなければなりません。アドレスバイトはRX9D
ビットが「1」であることにより識別されます(データバイトは「0」)。ADDEN ビットがスレーブのRCSTA
レジスタでセットされている場合、すべてのデータバイトは無視されます。しかし、第9
受信バイトが「1 」の場合、受信バイトがアドレスであることを示すので、スレーブは割込み発生して、RSR
レジスタの内容が受信バッファに転送されます。これにより、スレーブはアドレスのみ割込み発生でき、スレーブがアドレス指定されたかどうか確認できるようにします。アドレス指定されたスレーブはそのADDEN
ビットをクリアしてマスターからのデータバイトを受信する準備をします。
ADDEN がセットされると、すべてのデータバイトは無視されます。STOP ビットの次にはデータバイトは受信バッファにロードされず、割り込みは発生しません。別のバイトがRSR レジスタにシフトインされた場合、前のデータバイトはなくなります。ADDEN ビットはレシーバーが9 ビット非同期モードで構成されているときのみ有効です。
一度非同期モードを選択すると、受信はビットCREN(RCSTA<4>)をセットすることによりイネーブルになります。
アドレス機能のついた非同期受信のセットアップ手順
(MicroChip社データシート参照)
![]() |
![]() |
![]() |